function move(ele, obj, cb){
    // 1. 计时器的关闭和开启
    clearInterval(ele.t);
    ele.t = setInterval(()=>{
        // 6. 设定计时器的清除时机
        let flag = true;
        // 2. 遍历属性和目标
        for(let i in obj){
            // 3. 获取当前值
            const now = i==="opacity" ? getStyle(ele, i)*100 : parseInt(getStyle(ele, i));
            // 4. 计算步长
            let speed = (obj[i] - now) / 10;
            speed = speed>0 ? Math.ceil(speed) : Math.floor(speed);
            // 5. 改变属性
            ele.style[i] = i==="opacity" ? (now+speed)/100 : now+speed+"px";
            // 8. 判断计时器是否该被清除
            if(now !== obj[i]) flag = false;
        }
        // 7. 清除计时器
        if(flag){
            clearInterval(ele.t);
            // 9. 执行传入的下一个功能
            cb && cb();
        }
    }, 30)
}
function getStyle(ele, attr){
    return getComputedStyle ? getComputedStyle(ele)[attr] : ele.currentStyle[attr];
}